Week 2 - Blink Using OS
blink_task.c
Go to the documentation of this file.
1 /**************************************************
2  * Texas A&M University
3  * Electronic Systems Engineering Technology
4  * ENTC-489 Embedded Real Time Software Development
5  * Author: willey
6  * File: blink_task.c
7  **************************************************/
14 #include <stdint.h>
15 #include <stdbool.h>
16 #include "blink.h"
17 
18 /**************************************************/
23 /**************************************************/
24 
25 #define BLINK_TASK_STACK_SIZE (OS_TASK_IDLE_STK_SIZE+0)
27 /* Priority definitions, Yellow blinks fastest so should be the highest
28  * priority task (lowest numberic value) */
29 #define BLUE_PRIO 18
30 #define RED_PRIO 19
31 #define YELLOW_PRIO 14
32 
33 #define YELLOW_FREQ (2 * MILLI_HZ_PER_HZ)
34 #define BLUE_RED_FREQ (1 * MILLI_HZ_PER_HZ)
38 #define RED_START_DELAY ((BLUE_RED_FREQ * OS_TICKS_PER_SEC) / (2 * MILLI_HZ_PER_HZ))
39 
40 /**************************************************/
54 { /* priority, led, delay, freq */
55  BLUE_PRIO, BLUE_LED, 0, BLUE_RED_FREQ
56 };
57 
59 { /* priority, led, delay, freq */
61 };
62 
64 { /* priority, led, delay, freq */
65  YELLOW_PRIO, YELLOW_LED, 0, YELLOW_FREQ
66 };
67 
68 /**************************************************/
84 
85 /**************************************************/
95 void blink_task( void *parms )
99 {
100  led_data_t info;
101  uint32_t led_on, blink_delay;
102  volatile uint32_t *led_port;
103 
104  /* using this intermidiate pointer so we only have to cast once */
105  info = *((led_data_t *)parms);
106 
107  /* get the address of the pin we will be using */
108  switch ( info.led_position )
109  {
110  case RED_LED:
111  led_on = RED_LED_PIN;
112  led_port = &(LAUNCH_OUTPUT_DATA);
113  break;
114 
115  case GREEN_LED:
116  led_on = GREEN_LED_PIN;
117  led_port = &(LAUNCH_OUTPUT_DATA);
118  break;
119 
120  case BLUE_LED:
121  led_on = BLUE_LED_PIN;
122  led_port = &(LAUNCH_OUTPUT_DATA);
123  break;
124 
125  case YELLOW_LED:
126  led_on = YELLOW_LED_PIN;
127  led_port = &(BOOST_OUTPUT_DATA);
128  break;
129 
130  default:
131  /* we don't know what to toggle, so we will stop the task here */
132  OSTaskSuspend(info.prio);
133  break;
134  } /* switch ( info->led_position ) */
135 
136  /* compute the blink delay just once, so we don't have to do this
137  * calculation over and over again. We get the frequency in milli Hz, and
138  * compute a time delay that is half that to get our 50% duty cycle */
139  blink_delay = ((OS_TICKS_PER_SEC * MILLI_HZ_PER_HZ) / info.blink_freq) / 2L;
140 
141  /* delay before we turn the LED on, remeber start_delay is in milliseconds */
142  OSTimeDly((OS_TICKS_PER_SEC * info.start_delay) / (uint32_t)1000);
143  *led_port = led_on;
144 
145  while (1)
146  {
147  /* to get a 50% duty cycle we have to divide the time in half
148  * also remember that the frequency is in kHz */
149  OSTimeDly(blink_delay);
150 
151  /* toggle the LED */
152  *led_port ^= led_on;
153  } /* while (1) */
154 
155 } /* blink_task () */
156 
157 /**************************************************/
164 void start_blinking ( void )
165 {
166  INT8U os_rval; /* used to store return values from OS calls */
167 
168  os_rval = OSTaskCreate(blink_task,&blue_config,&blue_task_stk[BLINK_TASK_STACK_SIZE-1],blue_config.prio);
169  if (os_rval != OS_ERR_NONE)
170  {
171  while (1)
172  {
173  /* something went badly wrong */
174  }
175  }
176  os_rval = OSTaskCreate(blink_task,&red_config,&red_task_stk[BLINK_TASK_STACK_SIZE-1],red_config.prio);
177  if (os_rval != OS_ERR_NONE)
178  {
179  while (1)
180  {
181  /* something went badly wrong */
182  }
183  }
184  os_rval = OSTaskCreate(blink_task,&yellow_config,&yellow_task_stk[BLINK_TASK_STACK_SIZE-1],yellow_config.prio);
185  if (os_rval != OS_ERR_NONE)
186  {
187  while (1)
188  {
189  /* something went badly wrong */
190  }
191  }
192 } /* start_blinking() */
193 
194 /**************************************************/
Definition: blink.h:70
static led_data_t red_config
Definition: blink_task.c:58
Definition: blink.h:72
#define BLINK_TASK_STACK_SIZE
Definition: blink_task.c:25
static OS_STK red_task_stk[BLINK_TASK_STACK_SIZE]
Definition: blink_task.c:82
static OS_STK blue_task_stk[BLINK_TASK_STACK_SIZE]
Definition: blink_task.c:81
#define BLUE_RED_FREQ
Definition: blink_task.c:34
static OS_STK yellow_task_stk[BLINK_TASK_STACK_SIZE]
Definition: blink_task.c:83
#define YELLOW_FREQ
Definition: blink_task.c:33
void blink_task(void *ptr)
Definition: blink_task.c:95
static led_data_t blue_config
Definition: blink_task.c:53
static led_data_t yellow_config
Definition: blink_task.c:63
#define RED_START_DELAY
Definition: blink_task.c:38
void start_blinking(void)
Definition: blink_task.c:164